#include <IO/VideoTextMode.h>
#include <Utility/intrinsic.h>
/*
@brief 设置光标位置
@param wPosition 光标位置
@note 当光标位置超出 80 * 25 页面范围会自动调整
*/
void VideoTextModePositionCursor(WORD wPosition)
{
    /* wPosition = wPosition % (VIDEO_TEXT_MODE_LIMIT >> 2); // 光标限制在 VIDEO_TEXT_MODE 段内，多出部分 wrap around */
    WORD wStart = VideoTextModeLocateStart() / 160; /* 页面起始行 */
    WORD wCursorRow = wPosition / 80; /* 光标所在行 */
    WORD wCursorColumn = wPosition % 80; /* 光标所在列 */
    if (wCursorRow > wStart + 24) /* 一页最多容纳 25 行 */
    {
        /* 上卷一行，即：当前页 1 ~ 24 行整体上移，光标仍然保持在 24 行，列数相应改变 */
        for (int i = wStart + 1; i < wStart + 25; i++)
        {
            VideoTextModeCopyLine(i - 1, i);
        }
        wCursorRow = wStart + 24; /* 当前页第 24 行 */
        VideoTextModeClearLine(wCursorRow, 1); /* 光标所在行清零 */
        wPosition = wCursorRow * 80 + wCursorColumn; /* 光标位置改变 */
    }
    /*
    * 向地址寄存器传入选项，再向数据寄存器取出数据 
    */
    OUT_BYTE(CRT_CONTROLLER_ADDR_REG, CRT_CONTROLLER_CURSOR_LOCATION_HIGH);
    OUT_BYTE(CRT_CONTROLLER_DATA_REG, (BYTE)(wPosition >> 8)); /* 写入高位 */
    OUT_BYTE(CRT_CONTROLLER_ADDR_REG, CRT_CONTROLLER_CURSOR_LOCATION_LOW);
    OUT_BYTE(CRT_CONTROLLER_DATA_REG, (BYTE)(wPosition)); /* 写入低位 */
}
